package com.quyunshuo.module.home.fragment.home

import android.app.usage.UsageStatsManager
import android.content.Context
import android.content.pm.PackageManager
import android.util.Log
import com.quyunshuo.edwinusetime.base.mvvm.m.BaseRepository
import com.quyunshuo.edwinusetime.network.HomeApiService
import com.quyunshuo.edwinusetime.network.bean.BaseResponse
import com.quyunshuo.edwinusetime.network.bean.ProjectTabItem
import com.quyunshuo.module.home.manager.AppUsage
import java.util.concurrent.TimeUnit
import javax.inject.Inject

/**
 * @author DBoy 2021/7/6 <p>
 * - 文件描述 :
 */
class HomeRepository @Inject constructor() : BaseRepository() {
    // 日志标签
    private val TAG = "HomeRepository"

    // 通过依赖注入获取的API服务
    @Inject
    lateinit var mApi: HomeApiService

    /**
     * 查询本地手机应用使用时长数据
     *
     * @param context Android上下文对象，用于获取系统服务
     * @param days 要查询的天数范围（如1表示最近1天）
     * @return 应用使用时长数据列表，按使用时长降序排序
     */
    fun getAppUsageStats(context: Context, days: Int): List<AppUsage> {
        // 1. 获取系统使用统计服务
        val statsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager

        // 2. 计算查询时间范围
        val endTime = System.currentTimeMillis() // 结束时间为当前时间
        val startTime = endTime - TimeUnit.DAYS.toMillis(days.toLong()) // 开始时间为结束时间减去指定天数

        // 3. 查询应用使用统计数据
        // INTERVAL_BEST 表示自动选择最佳时间间隔
        val stats = statsManager.queryUsageStats(
            UsageStatsManager.INTERVAL_BEST,
            startTime,
            endTime
        )

        // 4. 处理查询结果
        return stats
            // 过滤掉使用时长为0的应用（未使用过的应用）
            .filter { it.totalTimeInForeground > 0 }

            // 将UsageStats转换为自定义的AppUsage对象
            .mapNotNull { usageStats ->
                try {
                    val packageName = usageStats.packageName

                    // 5. 获取应用信息
                    val appInfo = context.packageManager.getApplicationInfo(packageName, 0)

                    // 6. 获取应用名称
                    val appName = context.packageManager.getApplicationLabel(appInfo).toString()

                    // 7. 获取应用图标
                    val icon = context.packageManager.getApplicationIcon(appInfo)

                    // 8. 创建AppUsage对象
                    AppUsage(
                        packageName = packageName,
                        appName = appName,
                        icon = icon,
                        duration = usageStats.totalTimeInForeground, // 前台使用时长（毫秒）
                        lastTimeUsed = usageStats.lastTimeUsed // 最后使用时间戳
                    )
                } catch (e: PackageManager.NameNotFoundException) {
                    // 9. 处理找不到应用的情况（可能应用已卸载）
                    // 记录日志并返回null，该应用将被过滤掉
                    Log.w(TAG, "Application not found: ${usageStats.packageName}")
                    null
                }
            }
            // 10. 按使用时长降序排序
            .sortedByDescending { it.duration }
    }
}